MDDWIKI:MDD2D:Efeitos de Partículas
O que é uma engine de partículas ? A engine de partículas é um sistema que permite criar belos efeitos especiais dinâmicos baseados na criação e gerenciamento de um grande número de sprites pequenos, independentes e que se movimentam. Para mais informações sobre engines de partículas veja O artigo da Wikipedia sobre o Sistema de Partículas. A engine de partículas nos permite criar diversos e variados efeitos especiais com o mínimo de esforço que nos permite ultrapassar a maioria dos jogos que se baseiam apenas em sprites. As áreas onde os efeitos de partículas podem ser utilizados incluem mas não estão limitados a : * Efeitos de Ambiente, como Cachueiras, fogo, fontes ou fumaça vindo das chaminés * Visualização de efeitos místicos, como teleportes ou outros pontos de interesse * Efeitos Gráficos para as Magias e Habilidades * Visualização dos efeitos de Status O arquivo de definição de efeitos Efeitos de Partículas são descritos em documentos xml. Elas descrevem uma ou mais partículas únicas ou emissores de partículas. É o elemento raiz do documento XML. Cada efeito é baseado em pelo menos uma partícula. Oferecendo, mas nem sempre que essas partículas raiz podem funcionar apenas como emissores que invocam outras novas partículas e não possuem uma aparência própria. Elas possuem as seguintes propriedades requeridas: ;position-x: posição (inicial) no mapa relativo a posição de onde o efeito é criado (baseado em pixels) ;position-y: posição (inicial) no mapa relativo a posição de onde o efeito é criado (baseado em pixels) ;position-z: posição (inicial) no mapa relativo a posição de onde o efeito é criado (baseado em pixels) As seguintes propriedades são opcionadas : ;lifetime: Tempo de vida em game-ticks. (padrão: unlimited ( ilimitado )) Em adição, eles podem ter quaisquer números de emissores e uma representação visual na forma de uma ou de uma . Partículas raiz que podem ter uma como tag filha que contenha o caminho para uma imagem. Nesse caso, essa imagem é utilizada como a representação visual da partícula raiz. Emissores serão sempre elementos-filho de uma partícula ou de outro emissor. Elas criam novas partículas a partir delas mesmas, o que também pode incluir emissores também. Eles também incluem um número de elementos-filho que definem a propriedade inicial das partículas criadas. Quando um dos elementos das propriedades seguintes está faltando o valor padrão é usado ao invés. Os elementos de propriedades devem ter pelo menos name e value ou name, min e max. Em adição eles podem ter também alguma alteração -''X'' opções que podem controlar as suas alterações de acordo com o tempo. Eles também podem ter quaisquer números de tags-filha (quando essas existem, todas as partículas-filha serão equipadas com esses emissores) e a tag-filha que substitui a imagem com uma animação. :;name: A propriedade controlada por essa tag :;value: ( valor de propriedade fixa ) Valor designado para as partículas criadas :;min, max: (valor da propriedade randômica) Alcance dos valores randômicos designados para a partículas criadas :;change-function: forma da função que altera-com-o-tempo. Valores possíveis são : "sinus", "saw", "triangle" e "square" :;change-period: Tempo em ticks até que a função seja repetida :;change-amplitude: Mudança Máxima aplicada para o min e max :;change-phase: Offset da Fase na Função em ticks Property types :;position-x: Posição (inicial) no mapa relativa a partícula-pai (baseado em pixels) (padrão: 0) :;position-y: Posição (inicial) no mapa relativa a partícula-pai (baseado em pixels) (padrão: 0) :;position-z: Posição (inicial) no mapa relativa a partícula-pai (baseado em pixels) (padrão: 0) :;image: caminho para a imagem que deverá ser desenhada na posição das partículas (padrão: sem imagem) :;horizontal-angle: clockwise angle of initial vector on horizontal plane in degree. 0° significa reto a direita. (Padrão: 0) :;vertical-angle: angle between ground and initial vector in degree. 0° significa paralelo ao chão. Positive values are upwards, negative downwards. (Padrão: 0 = paralelo ao chão) :;power: Velocidade inicial das partículas em pixels/ game-tick (padrão: 0) :;gravity: Desaceleração das partículas em pixels/game-tick² (padrão: 0) :;randomness: Alterações randômicas nos vetores X, Y e Z. A unidade é quantidade máxima de pixels/game-tick/1000. (somente inteiros, padrão: 0) :;lifetime: Tempo de vida em game ticks (somente inteiros, padrão: -1 = ilimitado) :;fade-out: Número de game ticks de tempo de vida restantes quando uma partícula começa a desaparecer tornando-se alpha. (somente , padrão: 0 = desabilitado) :;fade-in: Número de game ticks enquanto as partículas desaparecem em sua total opacidade. (somente inteiros, padrão: 0 = invocadas com total opacidade) :;alpha: Opacidade das partículas criadas após o fade-in e antes do fade-out. (padrão: 1 = opacidade total) :;output: Número de partículas criadas por saída (somente inteiros, padrão: 1) :;output-pause: Pausa em ticks entre duas saídas de partículas (somente inteiros, padrão: 0) :;acceleration: A aceleração de partículas sobre um alvo em pixels/game-tick² (padrão: 0) :;momentum: Momentum das partículas. Antes de adicionar a aceleração de vetores antigos elas são multiplicadas por isso. Um momentum de 1, cria um objeto perfeitamente newtoniano. Um momentum um pouco menor, dá a impressão de que as partículas estão quebradas. Um momentum alto, faz as partículas acelerarem muito. Isso parece bem estranho, mas pode ser útil para alguns efeitos. Um momentum negativo fica realmente feio. (Padrão: 1) :;die-distance: Somente utilizada junto com a aceleração. Distância em pixels para o alvo que cause a destruição das partículas ao ser alcançadas. (Padrão: 0 = não destruído no contato) :;bounce: Quando maior que 0, as partículas não desaparecem quando tocam o chão. Ao invés disso, elas pulam com um vetor igual a seu vetor antigo multiplicado por essa propriedade. É recomendado adicionar um tempo de vida limitado para particulas saltadoras por que senão elas serão imortais. (Padrão: 0) :;follow-parent: Quando está propriedade está setadas, as partículas se movem quando a partícula-pai se move. Isso é especialmente útil para evitar distorções de efeitos de partículas baseadas em Coisas quando os mesmos morrem. Essa propriedade não possui valores - sua existência por si só cria esse comportamento. A tag de animação pode ser utilizada como uma tag-filha da tag para tornar a partícula raiz em uma imagem animada or ela pode ser usada como uma tag-filha de um emissor. Nesse caso, o emissor invoca partículas animadas ao invés de estáticas. O uso é similar ao da Tag animation descrita em Animations#.3Canimation.3E. Você pode usar os mesmos elementos filhos com a mesma sintaxe. A única diferença são as propriedades da tag de animação. Não há uma propriedade de direção. Ao invés, é usada a imageset que é descrita na tag de imagem com as propriedades imageset, width e height. Todas as três propriedades são requeridas. Configurações relacionadas a Partícula de Engines particleFastPhysics Substitui os cálculos intensos a CPU de Squareroot para os vetores das partículas baseadas em alvo por cálculos menos intensos mas menos imprecisos. 0 usa uma função lenta mas mais precisa na biblioteca padrão da C. Setando isso para 1 usa a função de aproximação squareroot que é muito mais veloz enquanto é menos precisa mas não funciona em todas as arquiteturas. 2 é um método ainda mais veloz is an even faster method that shouldn't have any portability problems but it is very inaccurate. Padrão: 0 particleMaxCount O número máximo de partículas no mundo jogo. Quando esse limite é alcançado, nenhuma nova partícula é invocada por emissores até que algumas partículas desapareçam. Esse limite é somente respeitado pelos emissores e não quando são invocados por novos efeitos para ter certeza que eles serão invocados quando o limite de partículas está no máximo. When the limit is maxed out the result is a quite unregular output of the particle emitters that looks quite ugly. So this situation should be avoided. The main reason this setting exists is to encourage the particle effect creators to keep the particle output of their emitters on a reasonable level and to keep the game playable in unusual particle-intense situations by accepting a glitchy appearance of the particle effects in this cases. Por favor note que algumas poucas partículas grandes podem reduzir o framerate mais do que várias pequenas partículas. Padrão: 3000 particleEmitterSkip The number of game ticks each emitter is inactive between two particle spawns. Setting this to a higher value keeps the numbers of particles down by reducing the output of the emitters. Isso é a maneira mais útil para o usuário reduzir a quantidade de partículas do que reduzindo o particleMaxCount por que ele não altera a maneira como os efeitos irão se parecer. Padrão: 0 Adicionando efeitos de partículas nos mapas Uma importante aplicação dos efeitos de partículas, são os efeitos baseados em mapas. Por essa razão, os efeitos de partículas podem ser adicionados aos mapas na forma de objetos do mapa. A versão atual do Tiled já suporta os Objetos de Mapa de maneira bem satisfatória, mas você pode adicionar os efeitos nos mapas também através de um editor de textos, como o Notepad ++. Isso é feito adicionando uma tag como uma tag-filha da tag (Quando o mapa não possui uma tag objectgroup ainda). Então você uma tag filha para cada efeito de partículas que você deseje adicionar para o mapa. A tag de Objeto possui 4 propriedades : ;type: DEVE ser "PARTICLE_EFFECT" ;name: O nome do arquivo do arquivo de definição de efeitos. ;x: Distância da borda esquerda do mapa em pixels. ;y: Distância da borda do topo do mapa em pixels. Aui está um exemplo de bloco de objectgroup de uma caverna de morcegos : Note que esse exemplo inclui muitas informações desnecessárias adicionadas pelo Tiled. A versão mínima que pode ser interpretada pelo editor do MDD 2D é o seguinte : Efeitos baseados em Mapas, são inicializados quando o jogador entra no mapa e continuam sendo calculados mesmo quando não estão sendo mostrados na tela do jogador. Por essa razão, você não deve adicionar muitos efeitos com muitas partículas em um único mapa. Senão você pode atingir o limite de particleMaxCount. Usando a engine de partículas para Programadores O elemento básico da engine de partículas é uma partícula especial de nome "particleEngine". Ela mantém uma árvore de efeitos de partículas. Cada partícula possui uma posição em um espaço tridimensional (neste caso o mundo do jogo bi-dimensional é tratado com um plano chato em um espaço tridimensional). Baseado no tipo de partícula que ela deseja ou não ter : * Movimento baseado nas propriedades físicas * Uma representação visual (uma imagem única ou uma animação) * Uma lista de emissores que criam partículas adicionais. As Partículas são uma classe derivada da classe "Sprite", então elas podem ser adicionadas para a lista de sprites do mapas para serem desenhadas juntos com outros sprites pela classe "map". Criação de Efeitos Efeitos são criados chamando particleEngine->addEffect(). Os argumentos são o arquivo de definição de efeitos, as coordenadas do mapa (baseadas em pixels) e o mapa em que o efeito deverá ser criado. Isso cria uma partícula hospedeira que pode ter diversos emissores. A partícula hospedeira é retornada então, ela pode ser manipulada depois. É possível também criar múltiplas partículas hospedeiras em um arquivo de efeito. Nesse caso somente a última partícula é retornada. Efeitos que seguem coisas Coisas podem ter controle de uma partícula. Isso acontece chamando a função membro controlParticle() da classe Being. O método usual para criar uma partícula que segue uma coisa, é chamando particleEngine->addEffect() e passar a partícula retornada para controlParticle(). Note que quando uma Coisa toma o controle de uma partícula, ela desabilita o apagamento automático da mesma. A Coisa é agora responsável por requisitar a remoção da partícula chamando Particle::kill(). Quando o fizer, a partícula irá ser apagada depois da próxima atualização. Partículas Seguidoras Uma partícula será atraída por outra partícula quando sua aceleração é maior que 0. Quando uma partícula é criada por um emissor, a partícula atrativa é a partícula hospedeira do efeito, mas ela pode ser alterada chamando Particle::setDestination(). Sempre recomendaremos usar uma partícula-pai como um alvo, por que uma segfault irá ocorrer caso a partícula alvo for removida. Adições possíveis Below is a list of proposed additions to the Particle System. Delayed effects In composite effects, it is often desirable to start a certain effect only after a certian amount of time has passed; for example, we might want to fade in a circle and only then suddenly flash a pentagram in its centre. This could be accomplished by an `on-death' emitter that is spawned when its parent particle dies. Random animation Random animation entry points/cel choices Right now, animation cels are looped through sequentially. For some effects, randomly picking one element each interval, or at least starting out at a random entry, may be preferable. Orbiting particle improvement Orbitting particles need a reference point; right now this is fixed to be the `base' particle. We need an option to choose the parent, grandparent, ... instead.